#include<bits/stdc++.h>
#define N 1100000
#define db double
#define ll long long
#define ldb long double
#define ull unsigned long long
using namespace std;
const int h=3,ki=149,mo=998244353;
int mod(int x){return (x%mo+mo)%mo;}
int inc(int x,int k){x+=k;return x<mo?x:x-mo;}
int dec(int x,int k){x-=k;return x>=0?x:x+mo;}
int ksm(int x,int k)
{
	int ans=1;
	while(k){if(k&1)ans=1ll*ans*x%mo;k>>=1;x=1ll*x*x%mo;}
	return mod(ans);
}
int inv(int x){return ksm(x,mo-2);}
int read()
{
	char ch=0;int x=0,flag=1;
	while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0',ch=getchar();}
	return x*flag;
}
void write(int x)
{
	if(!x)return (void)putchar(48);
	if(x<0)putchar(45),x=-x;
	int len=0,p[20];
	while(x)p[++len]=x%10,x/=10;
	for(int i=len;i>=1;i--)putchar(p[i]+48);
}
void writeln(int x){write(x),putchar('\n');}
int pos[N],ans[N];
struct query{int l,r,id;}q[N];
bool cmp(query a,query b)
{
	if(pos[a.l]^pos[b.l])return pos[a.l]<pos[b.l];
	else return pos[a.l]&1?(a.r<b.r):(a.r>b.r);
}
int main()
{
	int n=read(),qnum=read(),lim=0;
	while(lim*lim<n)lim++;
	for(int i=1;i<=n;i++)pos[i]=(i-1)/lim+1; 
	for(int i=1;i<=qnum;i++)q[i].l=read(),q[i].r=read(),q[i].id=i;
	sort(q+1,q+qnum+1,cmp);
	for(int i=1,l=1,r=0;i<=qnum;i++)
	{
		int L=q[i].l,R=q[i].r;
		if(r<R){for(r++;r<=R;r++)add(r);r--;}
		if(r>R)for(;r>R;r--)del(r);
		if(l<L)for(;l<L;l++)del(l);
		if(l>L){for(l--;l>=L;l--)add(l);l++;}
		ans[q[i].id]=now;
	}
	return 0;
}
